<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // promise是es6新增的一种解决异步的方案，同时也解决了回调函数带来的不方便

    // Promise对象有以下两个特点。

    // （1）对象的状态不受外界影响。Promise对象代表一个异步操作，有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）。只有异步操作的结果，可以决定当前是哪一种状态，任何其他操作都无法改变这个状态。这也是Promise这个名字的由来，它的英语意思就是“承诺”，表示其他手段无法改变。

    // （2）一旦状态改变，就不会再变，任何时候都可以得到这个结果。Promise对象的状态改变，只有两种可能：从pending变为fulfilled和从pending变为rejected。只要这两种情况发生，状态就凝固了，不会再变了，会一直保持这个结果，这时就称为 resolved（已定型）。如果改变已经发生了，你再对Promise对象添加回调函数，也会立即得到这个结果。这与事件（Event）完全不同，事件的特点是，如果你错过了它，再去监听，是得不到结果的。


    // ES6 规定，Promise对象是一个构造函数，用来生成Promise实例。
    // new Promise()里面需要传入一个参数(函数)
    // 这个函数又有两个参数resolve, reject
    // 又会返回一个小写的promise实例
    // resolve是成功以后调用的函数
    // reject是失败以后调用的函数
    // const promise = new Promise(function(resolve, reject) {
    //   setTimeout(() => {
    //     console.log(123);
    //     resolve(); // 调用resolve(),表示已经认为状态已经从 进行中 变成了 已成功
    //   }, 2000)
    // });

    // // then是在promise的状态变成 已成功 时调用
    // promise.then(() => {
    //   console.log(456);
    // })




    

    // promise的封装
    // 要对异步做封装，可以将异步的代码放到 return new Promise的里面
    function delay(ms) {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve()
        }, ms)
      })
    }
    delay(2000).then(() => {
      console.log(123333);
    })
    
    

    // resolve里面是可以传递参数的
    // 传递的参数可以在then的函数里面接受
  </script>
</body>
</html>